/*
 * Copyright (c) 2001, 2005, Oracle and/or its affiliates. All rights reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
 * published by the Free Software Foundation.  Oracle designates this
 * particular file as subject to the "Classpath" exception as provided
 * by Oracle in the LICENSE file that accompanied this code.
 *
 * This code is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 * or visit www.oracle.com if you need additional information or have any
 * questions.
 */

package com.nulldev.util.web.URLUtils.internal;

import java.net.URL;
import java.security.Principal;

import javax.net.ssl.SSLPeerUnverifiedException;

import com.nulldev.util.JVM.LegacyReflectionUtils;

import sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection;

import java.net.Proxy;
import java.net.SecureCacheResponse;
import java.io.IOException;

/**
 * This class was introduced to provide an additional level of abstraction
 * between javax.net.ssl.HttpURLConnection and com.sun.net.ssl.HttpURLConnection
 * objects.
 * <p>
 *
 * javax.net.ssl.HttpURLConnection is used in the new sun.net version of
 * protocol implementation (this one) com.sun.net.ssl.HttpURLConnection is used
 * in the com.sun version.
 *
 */
@SuppressWarnings(value =
	{ "all" })
public class DelegateHTTPSURLConnection extends AbstractDelegateHttpsURLConnection {

	// we need a reference to the HttpsURLConnection to get
	// the properties set there
	// we also need it to be public so that it can be referenced
	// from sun.net.www.protocol.http.HttpURLConnection
	// this is for ResponseCache.put(URI, URLConnection)
	// second parameter needs to be cast to javax.net.ssl.HttpsURLConnection
	// instead of AbstractDelegateHttpsURLConnection
	public javax.net.ssl.HttpsURLConnection httpsURLConnection;

	DelegateHTTPSURLConnection(URL url, sun.net.www.protocol.http.Handler handler, javax.net.ssl.HttpsURLConnection httpsURLConnection) throws IOException {
		this(url, null, handler, httpsURLConnection);
	}

	DelegateHTTPSURLConnection(URL url, Proxy p, sun.net.www.protocol.http.Handler handler, javax.net.ssl.HttpsURLConnection httpsURLConnection)
			throws IOException {
		super(url, p, handler);
		this.httpsURLConnection = httpsURLConnection;
	}

	protected javax.net.ssl.SSLSocketFactory getSSLSocketFactory() {
		return httpsURLConnection.getSSLSocketFactory();
	}

	protected javax.net.ssl.HostnameVerifier getHostnameVerifier() {
		return httpsURLConnection.getHostnameVerifier();
	}

	/*
	 * Called by layered delegator's finalize() method to handle closing the
	 * underlying object.
	 */
	protected void dispose() throws Throwable {
		/* NCOMPAT: finalize() was removed as JRE 18 removes finalization. */
	}

	Principal getLocalPrincipal() {
		if (cachedResponse != null) {
			return ((SecureCacheResponse) cachedResponse).getLocalPrincipal();
		}

		if (http == null) {
			throw new IllegalStateException("connection not yet open");
		} else {
			return (Principal) LegacyReflectionUtils.invokeFunction(super.getClass(), "getLocalPrincipal");
		}
	}

	/**
	 * Returns the server's principal, or throws SSLPeerUnverifiedException if the
	 * server did not authenticate.
	 */
	Principal getPeerPrincipal() throws SSLPeerUnverifiedException {
		if (cachedResponse != null) {
			return ((SecureCacheResponse) cachedResponse).getPeerPrincipal();
		}

		if (http == null) {
			throw new IllegalStateException("connection not yet open");
		} else {
			return (Principal) LegacyReflectionUtils.invokeFunction(super.getClass(), "getPeerPrincipal");
		}
	}
}